package com.dylon.system.service.impl;

import com.dylon.common.constant.UserConstants;
import com.dylon.common.exception.BusinessException;
import com.dylon.common.utils.StringUtils;
import com.dylon.system.domain.SysModule;
import com.dylon.system.domain.SysProject;
import com.dylon.system.mapper.SysModuleMapper;
import com.dylon.system.mapper.SysProjectMapper;
import com.dylon.system.service.ISysModuleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class SysModuleServiceImpl implements ISysModuleService {

    @Autowired
    SysModuleMapper moduleMapper;
    @Autowired
    SysProjectMapper projectMapper;

    /**
     * 查询模块管理数据
     * @param module 模块信息
     * @return 模块信息集合
     */
    @Override
    public List<SysModule> selectModuleList(SysModule module){
        return moduleMapper.selectModuleList(module);
    }

    /**
     * 查询模块管理树
     * @param module 模块信息
     * @return 所有模块信息
     */
    @Override
    public List<Map<String, Object>> selectModuleTree(SysModule module){
        List<Map<String, Object>> trees = new ArrayList<Map<String, Object>>();
        List<SysModule> modules = moduleMapper.selectModuleList(module);
        trees = getTrees(modules );
        return trees;
    }

    /**
     * 通过模块ID查询模块
     * @param moduleId 模块ID
     * @return 模块对象信息
     */
    @Override
    public SysModule selectModuleById(Long moduleId){
        return moduleMapper.selectModuleById(moduleId);
    }

    /**
     * 校验模块名称是否唯一
     * @param module 模块信息
     * @return 结果
     */
    @Override
    public String checkModuleNameUnique(SysModule module){
        Long moduleId = StringUtils.isNull(module.getModuleId()) ? -1L : module.getModuleId();
        SysModule info = moduleMapper.checkModuleNameUnique(module.getModuleName(), module.getParentId());
        if (StringUtils.isNotNull(info) && info.getModuleId().longValue() != moduleId.longValue()) {
            return UserConstants.MODULE_NAME_NOT_UNIQUE;
        }
        return UserConstants.MODULE_NAME_UNIQUE;
    }

    /**
     * 通过模块ID删除模块
     * @param moduleId 模块ID
     * @return 结果
     */
    @Override
    public boolean deleteModuleById(Long moduleId)throws Exception{
        SysModule module = selectModuleById(moduleId);
        if (countModuleUsedById(moduleId) > 0) {
            throw new BusinessException(String.format("%1$s下已存在接口,不能删除", module.getModuleName()));
        }
        if (countModuleChildById(moduleId) > 0) {
            throw new BusinessException(String.format("%1$s下已存在子模块,不能删除", module.getModuleName()));
        }
        return moduleMapper.deleteModuleById(moduleId) > 0 ? true : false;
    }

    /**
     * 修改保存模块信息
     * @param module 模块信息
     * @return 结果
     */
    @Override
    public int updateModule(SysModule module){
        return moduleMapper.updateModule(module);
    }

    /**
     * 新增保存模块信息
     * @param module 模块信息
     * @return 结果
     */
    @Override
    public int insertModule(SysModule module){
        if(0L==module.getParentId()){
            module.setPath("0");
        }else{
            SysModule parent = moduleMapper.selectModuleById(module.getParentId());
            if(!UserConstants.MODULE_NORMAL.equals(parent.getStatus())){
                throw new BusinessException("模块停用，不允许新增");
            }
            module.setPath(parent.getPath()+","+parent.getModuleId());
        }
        return moduleMapper.insertModule(module);
    }

    /**
     * 模块状态修改
     * @param module 模块信息
     * @return 结果
     */
    @Override
    public int changeStatus(SysModule module){
        return moduleMapper.updateModule(module);
    }

    /**
     * 查询模块被使用数量
     * @param moduleId 角色ID
     * @return 结果
     */
    @Override
    public int countModuleUsedById(Long moduleId){
        return moduleMapper.selectUsedCountModuleById(moduleId);
    }

    /**
     * 查询模块子节点使用数量
     * @param moduleId 角色ID
     * @return 结果
     */
    @Override
    public int countModuleChildById(Long moduleId){
        return moduleMapper.selectCountModuleByParentId(moduleId);
    }

    /**
     * 对象转模块树
     * @param modules 模块列表
     * @return
     */
    public List<Map<String, Object>> getTrees(List<SysModule> modules ) {
        List<Long> existsProjectList = new ArrayList<>();
        List<Map<String, Object>> trees = new ArrayList<Map<String, Object>>();
        for (SysModule module : modules){
            if (UserConstants.MODULE_NORMAL.equals(module.getStatus())){
                Map<String, Object> moduleMap = new HashMap<String, Object>();
                moduleMap.put("id", module.getModuleId() );

                if(null==module.getParentId() || 0l==module.getParentId()){
                    SysProject project = projectMapper.selectProjectById(module.getProjectId());

                    if(!existsProjectList.contains(project.getProjectId())){
                        Map<String, Object> projectMap = new HashMap<String, Object>();
                        projectMap.put("id", project.getProjectId() );
                        projectMap.put("pId", 0);
                        projectMap.put("name", project.getProjectName());
                        projectMap.put("title", project.getProjectName());
                        trees.add(projectMap);

                        existsProjectList.add(project.getProjectId());
                    }
                    moduleMap.put("pId", module.getProjectId());
                }else{
                    moduleMap.put("pId", module.getParentId());
                }
                moduleMap.put("name", module.getModuleName());
                moduleMap.put("title", module.getModuleName());
                moduleMap.put("checked", false);
                trees.add(moduleMap);
            }
        }
        return trees;
    }
}
